# -*- coding: utf-8 -*-

'''
@author: Soraia Janeiro 6051
@author: Lenia Andrade 5607
@date: Junho 2013
@summary: Este modulo contem a classe Controlador
'''

import calculos as calc
import listas_aleatorias as lista
import algorithm_library as algoritmo


class Controlador():
	
	'''
    @summary: A classe faz a chamada aos metodos necessarios para execução das operações da aplicação.
    '''
	
	global lista1
	
	def criar_lista(self,valor_min, valor_max, num_elementos):
		'''
		@summary: O metodo cria uma lista de numeros aleatorios.
		@param valor_min: Numero minimo do intervalo.
		@param valor_max: Numero maximo do intervalo.
		@param num_elementos: Numero de elementos da lista.
		@return: lista_gerada, retorna uma lista com valores aleatorios, entre o valor minimo e maximo.
		'''
		
		global lista1
		lista1 = lista.ListasAleatorias()
		lista_gerada = lista1.gerar_lista(valor_min, valor_max, num_elementos)
		return lista_gerada
	
	def getLista(self):
		
		'''
		@summary: O metodo retorna a lista.
		@return: lista_gerada, retorna uma lista criada.
		'''
		global lista1
		listaGerada = lista1.getListaGerada()
		return listaGerada
	
	def getAlgoritmos(self, valorCombo):
		
		'''
		@summary: O metodo faz a chamada aos algoritmos.
		@param valorCombo: Nome do algortimo que está na comboBox.
		'''
		
		xAlgoritmo = algoritmo.Algorithm_library()
		if valorCombo == "Bubble Sort":
			x = xAlgoritmo.bubbleSort(self.getLista())
			return x
		if valorCombo == "Insertion Sort":
			x = xAlgoritmo.insertionSort(self.getLista())
			return x
		if valorCombo == "Heap Sort":
			x = xAlgoritmo.heapsort(self.getLista())
			return x
		if valorCombo == "Merge Sort":
			listaMerge = self.getLista()
			x = xAlgoritmo.mergeSort(listaMerge, 0, len(listaMerge)-1)
			return x
		if valorCombo == "Quick Sort":
			listaQuick = self.getLista()
			x = xAlgoritmo.quicksort(listaQuick, 0, len(listaQuick)-1)
			return x
	
	def calcularMediaTempos(self,metodo_escolhido,numero_execucoes):
		
		'''
		@summary: O metodo calcula a media dos tempos de execução do algoritmo.
		@param metodo_escolhido: Algoritmo escolhido.
		@param numero_execucoes: Numero de vezes que o algoritmo  é executado.
		@return: resultado_media, retorna a media.
		'''
		calculo = calc.Calculos()
		tempos = calculo.calcular_tempos(self.getLista(),metodo_escolhido,numero_execucoes)
		resultado_media = calculo.media(tempos)
		return resultado_media
			
		
		
	
	
		
		
	

